package com.pai4j.message.core.sender;

import com.pai4j.message.model.MessageContext;
import com.pai4j.message.model.SendResult;

/**
 * 消息发送器接口
 * 用于支持多种消息发送渠道（MQ、WebSocket、Email等）
 * 
 * 实现此接口可扩展新的发送渠道
 *
 * @author PAI4J Team
 * @date 2025-11-01
 */
public interface MessageSender {

    /**
     * 获取发送渠道标识
     * 
     * @return 渠道标识（如：message-queue、websocket、email等）
     */
    String getChannel();

    /**
     * 发送消息
     * 
     * @param context 消息上下文
     * @return 发送结果
     */
    SendResult send(MessageContext context);

    /**
     * 判断是否支持指定的发送渠道
     * 
     * @param channel 渠道标识
     * @return 是否支持
     */
    default boolean supports(String channel) {
        return getChannel().equalsIgnoreCase(channel);
    }

    /**
     * 获取发送器的优先级
     * 数字越小优先级越高
     * 
     * @return 优先级（默认100）
     */
    default int getPriority() {
        return 100;
    }

    /**
     * 判断发送器是否可用
     * 
     * @return 是否可用
     */
    default boolean isAvailable() {
        return true;
    }

    /**
     * 批量发送消息（可选实现，用于性能优化）
     * 
     * @param contexts 消息上下文列表
     * @return 发送结果列表
     */
    default java.util.List<SendResult> batchSend(java.util.List<MessageContext> contexts) {
        java.util.List<SendResult> results = new java.util.ArrayList<>();
        if (contexts != null) {
            for (MessageContext context : contexts) {
                results.add(send(context));
            }
        }
        return results;
    }

    /**
     * 异步发送消息（可选实现）
     * 
     * @param context 消息上下文
     * @return 发送结果Future
     */
    default java.util.concurrent.CompletableFuture<SendResult> sendAsync(MessageContext context) {
        return java.util.concurrent.CompletableFuture.supplyAsync(() -> send(context));
    }

    /**
     * 获取发送器描述信息
     * 
     * @return 描述信息
     */
    default String getDescription() {
        return String.format("MessageSender[channel=%s, priority=%d]", getChannel(), getPriority());
    }
}

